package net.sh.dpinfrastructure.db;

import java.io.Serializable;
import java.util.LinkedHashMap;

import org.apache.commons.lang3.StringUtils;

/**
 * 
 * 排序及分页
 * 
 * @version 1.0
 * @since JDK1.7
 * @author Lancer
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2017 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2017年2月8日 下午9:02:17
 */
public class DPPageAndSort implements Serializable {

    private static final long serialVersionUID = 1L;
    
    /**
     * 默认当前页
     */
    public static final int DEFAULT_PAGE = 1;
    
    /**
     * 默认每页显示记录条数
     */
    public static final int DEFAULT_ROWS = 20;

    /**
     * 是否求总数
     */
    private boolean count = false;

    /**
     * 排序字段
     */
    private String orderField;

    /**
     * 多个排序规则
     */
    private LinkedHashMap<String, DPOrderType> orders;

    /**
     * 排序方式（true 正序，false 逆序）
     */
    private DPOrderType orderType;
    
    /**
     * 当前页
     */
    private int page = DEFAULT_ROWS;
    
    /**
     * 每页显示行数
     */
    private int rows = DEFAULT_PAGE;
    
    /**
     * 
     * Creates a new instance of DPPageAndSort. 
     *
     */
    public DPPageAndSort() {
        
    }

    /**
     * 带参数的构造函数
     * @param orderField 排序字段
     * @param orderType 排序类型，true：顺序，false：逆序
     * @param page 当前页，第一页从1开始
     * @param rows 每页显示条数
     */
    public DPPageAndSort(String orderField, DPOrderType orderType, int page, int rows) {
        if (page < 1) {
            throw new IllegalArgumentException("page is less than 1");
        }
        if (rows < 1) {
            throw new IllegalArgumentException("rows is less than 1");
        }
        if (StringUtils.isNotEmpty(orderField) && orderType == null) { // 设置排序字段没设置排序规则时默认升序
            throw new IllegalArgumentException("no order type");
        } else if (orderType != null && StringUtils.isEmpty(orderField)) { // 当设置了排序规则却没设置排序字段时抛出异常
            throw new IllegalArgumentException("no order field");
        }
        this.orderField = orderField;
        this.orderType = orderType;
        this.page = page;
        this.rows = rows;
    }
    
    public boolean getCount() {
        return count;
    }

    /**
     * 
     * 获取需要排序的字段，可能为空，为空时 {@link #getOrderType()} 页返回空
     *
     * @return
     * 
     * @author shaohui
     * @date 2016年4月14日 下午6:36:08
     */
    public String getOrderField() {
        return orderField;
    }

    public LinkedHashMap<String, DPOrderType> getOrders() {
        return orders;
    }

    /**
     * 
     * 获取排序类型，可能为空，为空时 {@link #getOrderField()} 也返回空
     *
     * @return
     * 
     * @author shaohui
     * @date 2016年4月14日 下午6:36:45
     */
    public DPOrderType getOrderType() {
        return orderType;
    }

    public int getPage() {
        return this.page;
    }

    public int getRows() {
        return rows;
    }
    
    public void setCount(boolean count) {
        this.count = count;
    }

    /**
     * 
     * 指定单个排序字段及排序方式
     * 
     * @param orderField
     * @param orderType
     *
     * @author shaohui
     * @date 2017年2月18日下午10:30:39
     * @since JDK 1.8
     */
    public void setOrder(String orderField, DPOrderType orderType) {
        if (StringUtils.isNotEmpty(orderField) && orderType == null) { // 设置排序字段没设置排序规则时默认升序
            throw new IllegalArgumentException("no order type");
        } else if (orderType != null && StringUtils.isEmpty(orderField)) { // 当设置了排序规则却没设置排序字段时抛出异常
            throw new IllegalArgumentException("no order field");
        }
        this.orderField = orderField;
        this.orderType = orderType;
    }

    /**
     * 
     * 指定多个排序字段及排序方式，如果排序字段或者排序方式为空则忽略该排序规则
     *
     * @param orders
     * 
     * @author Lancer
     * @date 2017年2月9日 下午7:30:24
     */
    public void setOrders(LinkedHashMap<String, DPOrderType> orders) {
        this.orders = orders;
    }
    
    /**
     * 
     * 设置当前页，不能小于1
     *
     * @param page
     * 
     * @author Lancer
     * @date 2017年2月9日 下午7:33:12
     */
    public void setPage(int page) {
        if (page < 1) {
            throw new IllegalArgumentException("page is less zhan 1");
        }
        this.page = page;
    }

    /**
     * 
     * 设置当前页显示记录条数，不能小于1
     *
     * @param rows
     * 
     * @author Lancer
     * @date 2017年2月9日 下午7:33:33
     */
    public void setRows(int rows) {
        if (rows < 1) {
            throw new IllegalArgumentException("rows is less zhan 1");
        }
        this.rows = rows;
    }

}
